home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
pascal
/
tvdmx.exe
/
TVDMXREP.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-07-16
|
13KB
|
541 lines
{■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■}
{ }
{ tvDMXREP --tvDMX Data Reporting Objects }
{ tvDMX --data editing project }
{ }
{ Copyright (c) 1992 Randolph Beck }
{ P.O. Box 56-0487 }
{ Orlando, FL 32856 }
{ CIS: 72361,753 }
{ }
{■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■}
Unit tvDMXREP;
{$V-,X+,B-,R-,I- }
interface
uses
Dos, Objects, Drivers, Memory, Views, Dialogs, App, MsgBox,
RSet, DmxGizma, tvDMX, tvGizma;
const
NewLineStr : string [20] = ^M^J;
cmPRN_NewPage = cmDMX + 40;
type
PDmxReport = ^TDmxReport;
TDmxReport = OBJECT (TObject)
DMX : PDmxScroller;
Delimiter : char;
LineNums : boolean;
CurPos : integer;
LeftMargin : integer;
RightMargin : integer;
PageWidth : integer;
PageSize : integer;
CurrentPage : integer;
CurrentLine : integer;
CurrentRecord : integer;
MarginHit : boolean;
ErrorInfo : word;
constructor Init (aDMX : PDmxScroller; ADelimiter : char;
ALineNums : boolean; APageSize,APageWidth : integer);
procedure PrintCtrl (St : string);
procedure DoPrint (var Buf; Count : word);
procedure GotoPos (Pos : integer);
procedure Print (var Buf; Count : word); VIRTUAL;
procedure SetupPage; VIRTUAL;
procedure EndPage; VIRTUAL;
procedure SetupDMX; VIRTUAL;
procedure EndDMX; VIRTUAL;
procedure SetupLine; VIRTUAL;
procedure EndLine; VIRTUAL;
function RecNumStr (RecNum : integer) : string; VIRTUAL;
procedure PrintStr (St : string);
procedure PrintLabels; VIRTUAL;
procedure PrintRec;
procedure PrintRows;
procedure Run; VIRTUAL;
end;
PDmxReportFile = ^TDmxReportFile;
TDmxReportFile = OBJECT (TDmxReport)
ReportText : Text;
constructor Init (aDMX : PDmxScroller; ADelimiter : char;
ALineNums : boolean; APageSize,APageWidth : integer;
AFilename : FNameStr);
destructor Done; VIRTUAL;
procedure Print (var Buf; Count : word); VIRTUAL;
end;
PDmxReportStream = ^TDmxReportStream;
TDmxReportStream = OBJECT (TDmxReport)
Stream : PStream;
constructor Init (aDMX : PDmxScroller; ADelimiter : char;
ALineNums : boolean; APageSize,APageWidth : integer;
AStream : PStream);
procedure Print (var Buf; Count : word); VIRTUAL;
end;
procedure DmxReportBox (ATitle :TTitleStr; Msg :string; Report :PDmxReport);
implementation
{ ══ TDmxReport ════════════════════════════════════════════════════════ }
constructor TDmxReport.Init (aDMX : PDmxScroller; ADelimiter : char;
ALineNums : boolean; APageSize,APageWidth : integer);
begin
TObject.Init;
DMX := aDMX;
Delimiter := ADelimiter;
LineNums := ALineNums;
PageSize := APageSize;
PageWidth := APageWidth;
end;
procedure TDmxReport.PrintCtrl (St : string);
var i,j,x : integer;
procedure IncPos;
begin
inc (j);
If (j <= LeftMargin) or (j >= RightMargin) then
begin
Delete (St,i,1);
Dec (i);
end;
end;
procedure DecPos;
begin
dec (j);
If (j >= LeftMargin) or (j <= RightMargin) then
begin
Delete (St,i,1);
Dec (i);
end;
end;
begin
j := CurPos;
If (length (St) > 0) then
begin
i := 1;
While (i <= length (St)) do
begin
Case St [i] of
^H : DecPos;
^I :
begin
x := j;
Repeat inc (x) until (x mod 8 = 0);
If (j < LeftMargin) or (x > RightMargin) then
begin
Delete (St,i,1);
Dec (i);
Repeat
inc (j);
If (j > LeftMargin) and (j < RightMargin) then
begin
inc (i);
Insert (' ',St,i);
end;
Until (j mod 8 = 0);
end
else
j := x;
end;
^J :
begin
inc (CurrentLine);
end;
^L :
begin
inc (CurrentPage);
CurrentLine := 0;
j := 0;
end;
^M :
begin
j := 0;
If (NewLineStr = ^M) then inc (CurrentLine);
end;
else IncPos;
end;
inc (i);
end;
If (length (St) > 0) then Print (St [1], length (St));
CurPos := j;
end;
If (Application <> nil) then Application^.Idle;
end;
procedure TDmxReport.DoPrint (var Buf; Count : word);
var i,j : integer;
x : integer;
P : PCharArray;
L : longint;
begin
If (Count = 0) then Exit;
P := @Buf;
L := Count;
x := CurPos + Count;
While (CurPos < LeftMargin) and (L > 0) do
begin
inc (ptrrec (P).ofs);
dec (L);
inc (CurPos);
end;
i := x;
While (i > RightMargin) and (L > 0) do
begin
dec (L);
dec (i);
MarginHit := TRUE;
end;
If (L > 0) then Print (P^, L);
CurPos := x;
end;
procedure TDmxReport.GotoPos (Pos : integer);
begin
While (CurPos < Pos) do PrintCtrl (' ');
While (CurPos > Pos) do PrintCtrl (^H);
end;
procedure TDmxReport.Print (var Buf; Count : word);
begin
Abstract
end;
procedure TDmxReport.SetupPage;
begin
end;
procedure TDmxReport.EndPage;
begin
PrintCtrl (^L);
end;
procedure TDmxReport.SetupDMX;
var i : integer;
S : string;
begin
S := RecNumStr (1) + '══';
If (Delimiter = #0) or (Delimiter >= #127) then
FillChar (S [1], length (S) - 1, '═')
else
FillChar (S [1], length (S), '-');
If LineNums then PrintStr (S);
If (DMX^.Limit.X > 0) then For i := 1 to DMX^.Limit.X do PrintStr (S [1]);
PrintCtrl (NewLineStr);
end;
procedure TDmxReport.EndDMX;
begin
SetupDMX; { print the same divider line }
end;
procedure TDmxReport.SetupLine;
begin
end;
procedure TDmxReport.EndLine;
begin
PrintCtrl (NewLineStr);
end;
function TDmxReport.RecNumStr (RecNum : integer) : string;
var S : string;
begin
If (CurrentRecord >= DMX^.DataBlockSize div DMX^.RecordSize) then
RecNumStr := ' '
else
begin
Str (succ (RecNum):5, S);
RecNumStr := S + ' ';
end;
end;
procedure TDmxReport.PrintStr (St : string);
begin
If (length (St) > 0) then DoPrint (St [1], length (St));
end;
procedure TDmxReport.PrintLabels;
begin
If (DMX^.Labels <> nil) then With PDmxLabels (DMX^.Labels)^ do
begin
DoPrint (Data^, Len);
end;
end;
procedure TDmxReport.PrintRec;
var i : integer;
A : string;
fieldrec : pDMXfieldrec;
DataRec : pointer;
begin
If (CurrentRecord < 0) or (CurrentRecord >= DMX^.DataBlockSize div DMX^.RecordSize) then
DataRec := nil
else
DataRec := DMX^.DataAt (CurrentRecord);
fieldrec := DMX^.DMXfield1;
While (fieldrec <> nil) do
begin
With fieldrec^ do
begin
If (access and accHidden = 0) then
begin
If access and accDelimiter <> 0 then
begin
If (typecode >= #127) and (Delimiter <> #0) then
A := Delimiter else A := typecode;
end
else
begin
If (DataRec = nil) then
begin
A [0] := char (length (fieldrec^.template^));
fillchar (A [1], length (A), ' ');
end
else
A := FieldString (fieldrec, [], DataRec^);
For i := 1 to length (A) do
If (Delimiter <> #0) then
begin
If (A [i] = showTRUE) then
begin
If (showTRUE >= #127) then A [i] := '*';
end
else
If (A [i] = showFALSE) then
begin
If (showFALSE >= #127) then A [i] := ' ';
end
else
If (A [i] = #0) then A [i] := ' '
else
If (A [i] < ' ') or (A [i] >= #127) then A [i] := '.';
end
else
If (A [i] in [^H,^I,^J,^L,^M]) then A [i] := '.';
end;
PrintStr (A);
end;